
package Ventanas;

import Offline.Deshacer;
import Online.Mensajes;
import java.awt.Color;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

/**
 * @author Alvaro Garcia Tapia
 * @author Pablo Mosquera Diaz
 * @author Victor Navarro Ortego
 * @author Adrian Neila Serrano
 * @author Daniel Sanchez Suarez
 * 
 * @proyecto Gestor de Tareas Online
 * @version 1.61
 */
public class VentanaMensajes extends JFrameConFondo{
    
    	
        private JLabel Mensaje;
        private String name;
        private String [] mensajes = new String[100];
        private DefaultTableModel dtm = new DefaultTableModel(); 
        private JTable table = new JTable(dtm);
        private JScrollPane jsp;
        private Ventana ventana;
        private VentanaMapa ventanam;
        private VentanaMensajes esta = this;
        private int tareai;
        private ArrayList<Deshacer> deshacer = new ArrayList<Deshacer>();
        private boolean online;
        
        public VentanaMensajes(final String name, final Ventana ventana,
                                final int numlista, final int tareai,final ArrayList deshacer,
                                final VentanaMapa ventanam,final boolean online){
                //constructor JFrame
		super("Litas de Mensajes"); 
                this.name = name;
                this.ventana = ventana;
                this.ventanam = ventanam;
                this.tareai = tareai;
                this.deshacer = deshacer;
                this.online = online;
            
                //Opciones de ventana
		this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
                //se añade la opción de preguntar antes de salir
                addWindowListener(new java.awt.event.WindowAdapter() {
                    public void windowClosing(java.awt.event.WindowEvent evt) {
                        if (ventana != null)
                            ventana.activar();
                        else
                            ventanam.activar();
                        setVisible(false);
                        setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
                    }
                });
                
		setLayout(null);
		setSize(525,615);
                setLocationRelativeTo(null);
		Container contenidoPanel = getContentPane();
		contenidoPanel.setBackground(Color.black);
                setIconImage(new ImageIcon(getClass().getResource("objetos/icono.png")).getImage()); 

                //Se obliga que las celdas no sean editables
                dtm = new DefaultTableModel();

                //Se crea el objeto que interactuara con la bbdd para tareas    
                final Mensajes mensaje = conectarMensaje();
                

                mensajes = mensaje.getMensajes(name);

        
                //Se calculan el numero de mensajes
                int nummensajes = 0;
                for(int j=0;j<mensajes.length && mensajes[j]!=null;j++){nummensajes++;}
                //Si hay menos de 19 tareas se indica que se pinten 19 tareas 
                if (nummensajes<17)
                    nummensajes=17;
        
                //Variable que contendra las 3 columnas (Nombre, Fecha, Tiempo)
                Object [][] contenidoTabla = new Object[3][nummensajes];  
                for(int j=0;j<mensajes.length && mensajes[j]!=null;j++){
                    //Se piden los datos de la tarea
                    String [] fila;
                    fila = mensaje.getMensaje(mensajes[j]);
                    if(fila[2].equals("1"))
                        contenidoTabla[0][j] = false;
                    else
                        contenidoTabla[0][j] = true;
                    
                    contenidoTabla[1][j] = fila[3];
                    contenidoTabla[2][j] = fila[1];
                }    

        
                dtm = new DefaultTableModel(){
                    public boolean isCellEditable (int fila, int columna) {
                        return false;
                    }
            
                    Class[] types = new Class [] {
                        java.lang.Boolean.class,java.lang.Object.class,java.lang.Object.class
                    };

                    public Class getColumnClass(int columnIndex) {
                        return types [columnIndex];
                    }
            
                };
        
                
                //Creacion de las cabeceras de la tabla
                dtm.addColumn("Leido",contenidoTabla[0]);
                dtm.addColumn("Tarea",contenidoTabla[1]);
                dtm.addColumn("Remitente",contenidoTabla[2]);

        
        //Se crea la tabla, estara compuesta por la tabla por defecto dtm
        
        table = new JTable(dtm);
        table.getColumn("Leido").setMaxWidth(60);
        table.setBackground (Color.DARK_GRAY);
        table.setForeground(Color.white);


        //Se elimina la posibilidad de posicionar columnas
        table.getTableHeader().setReorderingAllowed(false);
        //Se limita la posibilidad del numero de filas a seleccionar
        table.setRowSelectionAllowed(true);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
        //Opciones de la tabla
        table.setRowHeight(30);
        table.getTableHeader().setFont(new java.awt.Font("Tahoma", 0, 15)); 
        table.getTableHeader().setBackground(Color.white);
        table.setFont(new java.awt.Font("Tahoma", 0, 14));
        table.setVisible(true); 
        table.addMouseListener(new MouseAdapter(){
            public void mouseClicked(MouseEvent e){
                if(e.getClickCount()==2){
                    int fila = table.rowAtPoint(e.getPoint());
                    int columna = table.columnAtPoint(e.getPoint());
                    if ((fila > -1) && (columna > -1))
                        if (table.getValueAt(fila,columna)!= null){
                            mensaje.leido(mensajes[fila]);
                            if(ventana != null){
                                Ventana window = ventana.ActualizarTablas(numlista,tareai,deshacer,online);
                                esta = new VentanaMensajes(name,window,numlista,tareai,deshacer,ventanam,online);
                                setVisible(false);
                                setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
                                new VentanaMensaje(mensajes[fila],window,esta,deshacer,null);
                            }
                            else{
                                VentanaMapa window = ventanam.ActualizarTablas(numlista,tareai,deshacer);
                                esta = new VentanaMensajes(name,null,numlista,tareai,deshacer,window,online);
                                setVisible(false);
                                setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
                                new VentanaMensaje(mensajes[fila],null,esta,deshacer,window);
                            }
                        }
                }
            }
         });
        
        //Se introduce un scroll para la tabla
        jsp = new JScrollPane(table);
        //Opciones del scroll
        jsp.setLayout(null);
        jsp.setBounds(30,22, 448, 537);
        jsp.setVisible(true);
        jsp.setLayout(new ScrollPaneLayout()); 
           
        //Opciones del panel que contiene la tabla
        add(jsp);        
    
        setVisible(true);
                
        }

    /**
     * Metodo para actualizar la tabla
     * @param deshacer 
     */    
     public void Actualizar(ArrayList deshacer){ 
         setVisible(false);
         setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
         if(ventana != null)
             ventana.ActualizarTablas(0,tareai,deshacer,online);
         else
             ventanam.ActualizarTablas(0, tareai, deshacer);
     }
        
      /**
     * Metodo para conectar los mensajes con la bbdd
     * @return La conexión con la bbdd
     */
    private Mensajes conectarMensaje(){
        //Se crea el objeto para actuar contra la bbdd
        Mensajes mensaje = new Mensajes();
        boolean salir = false;
        //Si no se ha conectado
        while (!mensaje.estado() && !salir){
            this.setCursor(Cursor.WAIT_CURSOR);
            String message = "Fallo al conectar con el servidor.\n¿Desea volver a intentar conectar?";
            String title = "Error de conexión";
            //Se ofrece la opcion de reconectar
            int reply = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION);
            this.setCursor(Cursor.DEFAULT_CURSOR);
            //Si rechazo reconectar
            if (reply == JOptionPane.NO_OPTION){     
                this.setCursor(Cursor.WAIT_CURSOR);
                salir=true;
                new VentanaInicio();
                //Se cierra la ventana de login
                if (ventana!=null)
                    ventana.setVisible(false);
                else
                    ventanam.setVisible(false);
                setVisible(false);
                setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
                this.setCursor(Cursor.DEFAULT_CURSOR);
            }
            //Si se acepto reconectar
            else{
                this.setCursor(Cursor.WAIT_CURSOR);
                //Se reconecta
                mensaje = new Mensajes();
                this.setCursor(Cursor.DEFAULT_CURSOR);
            }    
        }
        return mensaje;
    }
    
}
